package com.example.demo.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.*;

/**
 * 类名：JWTUtil.java
 * 路径：com.example.demo.utils.JWTUtil.java
 * 创建人：tanyp
 * 创建时间：2019/12/10 15:07
 * 功能：JWT工具类
 * 修改人：
 * 修改时间：
 * 修改备注：
 */

@Slf4j
@Component
public class JWTUtil {

    // token秘钥
    private static final String secret = "JWTsecret";

    //token过期时间: 2小时
    public static final int calendarField = Calendar.MINUTE;

    // 过期时间
    private static final int calendarInterval = 120;

    /**
     * 方法名：createToken
     * 功能：生成token
     * 创建人：tanyp
     * 创建时间：2019/12/10 15:12
     * 入参：JWT构成: header, payload, signature
     * 出参：token
     * 修改人：
     * 修改时间：
     * 修改备注：
     */
    public static String createToken(String userId) {
        try {
            Date iatDate = new Date();
            Calendar nowTime = Calendar.getInstance();
            nowTime.add(calendarField, calendarInterval);
            Date expiresDate = nowTime.getTime();
            Map<String, Object> map = new HashMap<>();
            map.put("alg", "HS256");
            map.put("typ", "JWT");
            String token = JWT.create().withHeader(map)
                    .withClaim("iss", "Service")
                    .withClaim("userId", userId)
                    .withIssuedAt(iatDate)
                    .withExpiresAt(expiresDate)
                    .sign(Algorithm.HMAC256(secret));
            log.info("生成token成功");
            return token;
        } catch (Exception e) {
            log.error("生成token异常：{}", e);
        }
        return null;
    }

    /**
     * 方法名：verifyToken
     * 功能：解密Token，验证是否正确
     * 创建人：tanyp
     * 创建时间：2019/12/10 15:16
     * 入参：token
     * 出参：
     * 修改人：
     * 修改时间：
     * 修改备注：
     */
    public static Map<String, Claim> verifyToken(String token) {
        DecodedJWT jwt = null;
        try {
            JWTVerifier verifier = JWT.require(Algorithm.HMAC256(secret)).build();
            jwt = verifier.verify(token);
            return jwt.getClaims();
        } catch (Exception e) {
            log.error("token验证异常：{}", e);
        }
        return null;
    }

    /**
     * 方法名：getUserId
     * 功能：跟token获取userId
     * 创建人：tanyp
     * 创建时间：2019/12/10 15:18
     * 入参：token
     * 出参：userId
     * 修改人：
     * 修改时间：
     * 修改备注：
     */
    public static String getUserId(String token) {
        try {
            Map<String, Claim> claims = verifyToken(token);
            Claim userId = claims.get("userId");
            if (!Objects.isNull(userId) && !Objects.equals("", userId.asString())) {
                return userId.asString();
            }
        } catch (Exception e) {
            log.error("获取userId异常：{}", e);
        }
        return null;
    }

}
